package com.knight.hadoop.day08.mr.wcdemo;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

/**
 * wordCount的Mapper,泛型参数表示的意思 KEYIN：默认情况下，是mr框架所读到的一行文本的起始偏移量，Long类型。
 * 因为需要网络间传递，所以需要序列化，使用Java默认的序列化效率过低，hadoop有精简了的序列化类，LongWritable VALUEIN
 * 默认情况下，是mr框架所读到的一行文本的内容，String，原因一样，使用Text
 * 
 * KEYOUT 用户处理逻辑完成后输出数据的key类型，这里是 String 也就是 Text VALUEOUT
 * 用户处理逻辑完成后输出数据的value类型。这里是Integer 也就是IntWritable
 * 
 * @author
 *
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
	
	/**
	 * Map的处理逻辑：
	 * 1、将字符串按照空格进行切分
	 * 2、因为map方法是一行行执行的，所以我们切分一个单词就输出一次
	 */
	@Override
	protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
		//将获取的文本转换成string并按照空格切分
		String line = value.toString();
		String[] values = line.split(" ");
		//循环遍历切分后的字符数组，并通过context输出，作为reduce的接受参数
		for(String word:values){
			//因为是切分每一句话，所以没有进行累加，格式 如：<hello,1>
			context.write(new Text(word), new IntWritable(1));
		}
	}

}
